package de.preisrobot.service;

import java.util.Date;
import java.util.List;

import javax.annotation.Resource;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import de.preiscrawler.LinkTyp;
import de.preiscrawler.parser.Parser;
import de.preisrobot.entity.Artikel;
import de.preisrobot.entity.AmazonArtikelImage;
import de.preisrobot.entity.CrawlerLinkUrl;
import de.preisrobot.entity.JobReport;
import de.preisrobot.entity.Preis;
import de.preisrobot.persistence.dao.ArtikelDao;
import de.preisrobot.service.internal.AmazonImageGrabber;
import de.preisrobot.service.internal.PreisRobotParserException;

@Service(value="amazonGrabberService")
public class AmazonGrabberService implements GrabberService {

	private static Logger logger = Logger.getLogger(AmazonGrabberService.class);

	@Resource(name = "artikelDaoImpl")
	private ArtikelDao dao;

	@Resource(name = "linkService")
	private AnbieterLinkProcessService linkService;

	private Parser parser;

	@Override
	/**
	 * return null bei Fehler
	 */
	public List<Artikel> grapUrl(CrawlerLinkUrl sourceUrlString) {
		JobReport rep = new JobReport();

		logger.info("grap Url: " + sourceUrlString);

		if (parser == null)
			throw new RuntimeException("no parser selected");

		List<Artikel> amazonList = null;

		int linkTyp = 0;

		boolean linkWasBroken = false;

		try {
			// de.preiscrawler.parser.AmazonParser p = new
			// de.preiscrawler.parser.AmazonParser();
			// amazonList = p.parse(sourceUrlString.getLink());
			amazonList = parser.parse(sourceUrlString.getLink());
			logger.info("found " + amazonList.size() + " Arikel");
			linkTyp = computeLinkType(amazonList);

		} catch (PreisRobotParserException e) {
			System.err.println("no valid elemnt was found on \n "
					+ sourceUrlString);
			linkWasBroken = true;
		} catch (Exception e) {
			e.printStackTrace();
			return amazonList;
		} finally {
			linkService.storeLink(sourceUrlString.getLink(), linkWasBroken,
					linkTyp, parser.getAnbieter(), 0);
			rep.setLinkId(sourceUrlString.getId());
		}

		if (amazonList != null) {
			try {
				saveNewArtikelOrUpdatePreis(amazonList, rep);
				dao.save(rep);
			} catch (Exception e) {
				logger.warn(sourceUrlString, e);
			}
		}
		rep.setState(JobReport.FINISHED);
		return amazonList;
	}

	private int computeLinkType(List<Artikel> amazonList) {
		return LinkTyp.LEAFE;
	}

	/**
	 * speichert den neuen Artikel oder updated den Preis
	 * 
	 * @param amazonList
	 * @param rep
	 */
	private void saveNewArtikelOrUpdatePreis(List<Artikel> amazonList,
			JobReport rep) {
		for (Artikel amazonArtikel : amazonList) {
			System.out.println(amazonArtikel.getArtikelNr() + " "
					+ amazonArtikel.getPreis());

			Artikel artikel = dao.find(amazonArtikel.getArtikelNr());

			if (artikel == null) {
				amazonArtikel.setAnbieterId(parser.getAnbieter());
				dao.saveArtikel(amazonArtikel);
				rep.addNewArtikel(amazonArtikel.getArtikelNr());
				try {
					grapImage(amazonArtikel);
				} catch (Exception e) {
					System.err.println(e);
				}
			} else {
				if (amazonArtikel.getPreis() != null) {
					createNewPreis(artikel.getId(), amazonArtikel.getPreis());
					rep.addNewPreis(amazonArtikel.getPreis());
				}
			}
		}
	}

	private void createNewPreis(long id, String preis) {
		Preis p = new Preis();

		p.setArtikelId(id);
		p.setPreis(preis);
		p.setCreationDate(new Date());

		dao.save(p);
	}

	@Override
	@Transactional(propagation = Propagation.REQUIRED)
	public void grapImage(Artikel amazonArtikel) {
		AmazonImageGrabber imageGrabber = new AmazonImageGrabber();
		String imagelink = amazonArtikel.getImageLink();
		
		
		
		AmazonArtikelImage image = imageGrabber.getImage(imagelink);

		if (image != null) {
			image.setArtikelId(amazonArtikel.getId());
			image.setArtikelNr(amazonArtikel.getArtikelNr());
			if (imagelink.endsWith("jpg"))
				image.setTyp("jpeg");
			else if (imagelink.endsWith("png"))
				image.setTyp("png");
			else if (imagelink.endsWith("gif"))
				image.setTyp("gif");
			else
				image.setTyp("");

			image.setCreationDate(new Date());
			image.setArtikelId(parser.getAnbieter());
			dao.save(image);
		}
	}

	@Override
	public void setParser(Parser p) {
		this.parser = p;
	}

	@Override
	public void grapAndSave(CrawlerLinkUrl sourceUrlString) {
		// TODO Auto-generated method stub
		
	}

}
